/*******************************************************************************
* Имя файла: tenTask.cpp
* Дата: 05-05-2024
* Разработчик: Андрей Подлегаев
* Группа: 315
* Факультет: ЦДО ТУСУР
* Лицензия: BSD
* Описание: Решение задач к лабораторной работе № 6 (ЦДО ТУСУР)
* *****************************************************************************/

#include "tenTask.h"

/* Реализация функции получения философом вилок */
std::array<int, 2> getForks(const int& xPhilosopherNumber)
{
  std::array<int, 2> forks;
  // Левая вилка
  forks[0] = xPhilosopherNumber;
  // Правая вилка
  forks[1] = (xPhilosopherNumber + 1) % philosopher;

  return forks;
}

std::mutex lockForks[philosopher];

/* Реализация функции блокировки вилок во время трапезы */
void getLockForks(const std::array<int, 2> xForks)
{
  std::unique_lock<std::mutex> leftFork(lockForks[xForks[0]]);
  std::unique_lock<std::mutex> rightFork(lockForks[xForks[1]]);
}


/* Реализация функции трапезы философа*/
void philosopherHavingMeal(const int& xPhilosopherNumber)
{
  getLockForks(getForks(xPhilosopherNumber));

  std::cout << "Философ " << xPhilosopherNumber << " приступил к трапезе"
            << "\tid:" << std::this_thread::get_id() << '\n';

  std::this_thread::sleep_for(std::chrono::milliseconds(1000));

  std::cout << "Философ " << xPhilosopherNumber << " завершил трапезу"
            << "\tid:" << std::this_thread::get_id() << '\n';

  //std::cout << "Философ " << xPhilosopherNumber << " завершил трапезу\n";

}

